home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Classes / ObjDB / Test.m < prev    next >
Encoding:
Text File  |  1992-07-31  |  16.8 KB  |  806 lines

  1. /*****
  2.  * Test.m
  3.  *
  4.  *    Main program for a console test pgm.
  5.  *
  6.  *****/
  7. #import "ObjDB.h"
  8. #import <streams/streams.h>
  9. #include <stdio.h>
  10. #define TRUE -1
  11. #define FALSE !TRUE
  12. char commands[39][10] = {
  13.     "open","close","quit","load","dump","restore",
  14.     "and","or","xor","not","all","find","status",
  15.     "structure","show","print","read","list","add",
  16.     "delete","update","init","dekey","keydb","keyfld",
  17.     "cache","alloc","isns","keys","keytbl","help",
  18.     "isn","fields","last","!","isntables","search","gripe",""};
  19. enum ops {
  20.     OPEN,CLOSE,QUIT,LOAD,DUMP,RESTORE,
  21.     AND,OR,XOR,NOT,ALL,FIND,STATUS,
  22.     STRUCTURE,SHOW,PRINT,READ,LIST,ADD,
  23.     DELETE,UPDATE,INIT,DEKEY,KEYDB,KEYFLD,
  24.     CACHE,ALLOC,ISNS,KEYS,KEYTBL,HELP,
  25.     ISN,FIELDS,LAST,SHELL,ISNTABLES,SEARCH,GRIPE,BAD
  26. };
  27.  
  28.     ObjDB        *myDB;
  29.  
  30. int main(argc, argv)
  31.     int argc;
  32.     char *argv[];
  33. {
  34.     NXTypedStream *typedStream;
  35.     char *get_word();
  36.     char desc[128], value[256], dbname[256], tmp_str[256], load_file[256];
  37.     char cmd[256];
  38.     int i,j,k,l,m, get_cmd(), *Isns, *Last, kount=0;
  39.     void prt_cmds();
  40.     int get_prompt(), num_words(), which_cmd();
  41.     int toupper();
  42.     union    {
  43.         int num;
  44.         char str[128];
  45.         } u;
  46.     FILE *fptr, *dfd_file;
  47.     int    opened = FALSE;
  48.     float dFrac;
  49.     FIELD    *myField;
  50.         
  51.     struct    {
  52.     char last_name[12];
  53.     char first_name[12];
  54.     long    phone_no;
  55.     char        state[3];
  56.     }    rec;
  57.     
  58.     if (argc == 2)    {
  59.         strcpy(dbname,argv[1]);
  60.         strcpy(desc,dbname);
  61.         strcat(desc,".dta");
  62.         goto open;
  63.         }
  64.     else    {
  65.         opened = FALSE;
  66.         strcpy(dbname,"NULL");
  67.         }
  68.     while(1)
  69.     {
  70.     printf("%s : %d > ",dbname,kount++);
  71.     switch(get_cmd(cmd))    {
  72.     case SHELL:
  73.         if( num_words(cmd) < 2)
  74.         {
  75.             strcat(cmd," ");
  76.             printf("Enter Shell Command : ");
  77.             gets(value);
  78.             strcat(cmd,value);
  79.         }
  80.         strcpy(desc,get_word(-1,cmd));
  81.         system(desc);
  82.         break;
  83.     case INIT:
  84.         dFrac = 0.75;
  85.         if( num_words(cmd) < 2)
  86.             get_prompt("Enter Data Base Name",dbname);
  87.         else
  88.             strcpy(dbname,get_word(1,cmd));
  89. /*        get data fraction here if num_words == 3    */
  90.         strcpy(load_file,dbname);
  91.         strcat(load_file,".dfd");
  92.         if((dfd_file = (FILE *)fopen(load_file,"r")) == NULL)
  93.         {
  94.             printf("Descriptor file for Database %s not located\n",dbname);
  95.             break;
  96.         }
  97. /* check if this already exists and warn */
  98.         myDB  = [[ObjDB alloc] init:dbname data_use_fraction:dFrac];
  99.         if ([myDB loadDFD:dfd_file] == NULL)
  100.         {
  101.             /*    Loading of data was not  */
  102.             printf("Error in reading Descriptor file for database %s\n",dbname);
  103.             break;
  104.         }    
  105.         /*    Write out the object , i.e. close existing database */
  106.         [myDB close];
  107.         strcpy(desc,dbname);
  108.         strcat(desc,".dta");
  109.         typedStream = NXOpenTypedStreamForFile(desc,NX_WRITEONLY);
  110.         NXWriteRootObject(typedStream,myDB);
  111.         NXCloseTypedStream(typedStream);
  112.         printf("DB Archived to %s\n",desc);
  113.         [myDB free];
  114.         opened = FALSE;
  115.         goto open;
  116.         break;
  117.     case OPEN:
  118.     /*    read in the archived object    , i.e. open an existing database */
  119.         if (opened)
  120.         {
  121.             printf("Must close first\n");
  122.             break;
  123.         }
  124.         if( num_words(cmd) != 2)
  125.             get_prompt("Enter Data Base Name",dbname);
  126.         else
  127.             strcpy(dbname,get_word(1,cmd));
  128.         strcpy(desc,dbname);
  129.         strcat(desc,".dta");
  130. open:        if(!(typedStream = NXOpenTypedStreamForFile(desc,NX_READONLY)))
  131.         {
  132.             printf("Database %s not located\n",dbname);
  133.             strcpy(dbname,"NULL");
  134.             break;
  135.         }
  136.         myDB = NXReadObject(typedStream);
  137.         NXCloseTypedStream(typedStream);
  138.         opened = TRUE;
  139.         break;
  140.     case ADD:
  141.         if (!opened)
  142.         {
  143.             printf("Must open first\n");
  144.             break;
  145.         }
  146.         j = [myDB numberFlds];
  147.         k = 0;
  148.         strcpy(desc,"");
  149.         for (i=0; i<j; i++)    {
  150.             myField = [myDB getFldDesc:i];
  151.             printf("%s : ",myField->name);
  152.             switch (myField->kind)    {
  153.             case 'I':
  154.             case 'L':
  155.                 gets(tmp_str);
  156.                 sscanf(tmp_str,"%d",&u.num);
  157.                 for (l=0;l<4;l++)
  158.                     value[k++] = u.str[l];
  159.                 strcat(desc,myField->abbrev);
  160.                 strcat(desc,",4,");
  161.                 break;
  162.             case 'A':
  163.                 gets(tmp_str);
  164.                 l = strlen(tmp_str);
  165.                 for(m=0;m<l;m++)
  166.                     value[k++] = tmp_str[m];
  167.                 strcat(desc,myField->abbrev);
  168.                 sprintf(tmp_str,",%d,",l);
  169.                 strcat(desc,tmp_str);
  170.                 break;
  171.             }
  172.         }
  173.         printf("Added Isn %d\n",
  174.             [myDB addData:(char *)value:desc]);
  175.         break;
  176.     case DEKEY:
  177.         if (!opened)
  178.         {
  179.             printf("Must open first\n");
  180.             break;
  181.         }
  182.         get_prompt("This will remove all keys, are you sure (y/n)?",desc);
  183.         if(toupper(desc[0]) == 'Y')
  184.             [myDB unKeyDB];
  185.         break;    
  186.     case AND:
  187.         if (!opened)
  188.         {
  189.             printf("Must open first\n");
  190.             break;
  191.         }
  192.         [myDB andIsns];
  193.         printf("Found %d matches\n",[myDB getListCount]);
  194.         break;    
  195.     case OR:
  196.         if (!opened)
  197.         {
  198.             printf("Must open first\n");
  199.             break;
  200.         }
  201.         [myDB orIsns];
  202.         printf("Found %d matches\n",[myDB getListCount]);
  203.         break;    
  204.     case XOR:
  205.         if (!opened)
  206.         {
  207.             printf("Must open first\n");
  208.             break;
  209.         }
  210.         [myDB xorIsns];
  211.         printf("Found %d matches\n",[myDB getListCount]);
  212.         break;    
  213.     case NOT:
  214.         if (!opened)
  215.         {
  216.             printf("Must open first\n");
  217.             break;
  218.         }
  219.         [myDB notIsns];
  220.         printf("Found %d matches\n",[myDB getListCount]);
  221.         break;    
  222.     case DUMP:
  223.         if (!opened)
  224.         {
  225.             printf("Must open first\n");
  226.             break;
  227.         }
  228.         if([myDB getListCount] == 0)
  229.         {
  230.             printf("No records selected, Dump aborted\n");
  231.             break;    
  232.         }
  233.         if (num_words(cmd) != 2)
  234.             get_prompt("Enter File Name to Dump to",desc);
  235.         else
  236.             strcpy(desc,get_word(1,cmd));
  237.         [myDB dumpIsns:[myDB getIsnList] toFile:desc];
  238.         break;    
  239.     case KEYDB:
  240.         if (!opened)
  241.         {
  242.             printf("Must open first\n");
  243.             break;
  244.         }
  245.         [myDB keyDB];
  246.         break;    
  247.     case KEYFLD:
  248.         if (!opened)
  249.         {
  250.             printf("Must open first\n");
  251.             break;
  252.         }
  253.         get_prompt("Enter field abbrev to key",desc);
  254.         [myDB setKeyField:desc];
  255.         break;    
  256.     case RESTORE:
  257.         if (opened)
  258.         {
  259.             printf("Must close first\n");
  260.             break;
  261.         }
  262.         dFrac = 0.75;
  263.         if( num_words(cmd) < 2)
  264.             get_prompt("Enter Data Base Name",dbname);
  265.         else
  266.             strcpy(dbname,get_word(1,cmd));
  267. /*        get data fraction here if num_words == 3    */
  268.         strcpy(load_file,dbname);
  269.         strcat(load_file,".dfd");
  270.         if((dfd_file = (FILE *)fopen(load_file,"r")) == NULL)
  271.         {
  272.             printf("Descriptor file for Database %s not located\n",dbname);
  273.             break;
  274.         }
  275.         myDB  = [[ObjDB alloc] init:dbname data_use_fraction:dFrac];
  276.         if ([myDB loadDFD:dfd_file] == NULL)
  277.         {
  278.             /*    Loading of data was not  */
  279.             printf("Error in reading Descriptor file for database %s\n",dbname);
  280.             break;
  281.         }    
  282.         if( num_words(cmd) != 3)
  283.             get_prompt("Enter Dump File Name",value);
  284.         else
  285.             strcpy(value,get_word(2,cmd));
  286.         [myDB loadDBfromFile:value];
  287.         opened = TRUE;
  288.         break;    
  289.     case FIND:
  290.         if (!opened)
  291.         {
  292.             printf("Must open first\n");
  293.             break;
  294.         }
  295.         if( num_words(cmd) < 2)
  296.             get_prompt("Enter keyed field",desc);
  297.         else
  298.             strcpy(desc,get_word(1,cmd));
  299.         if(!strcasecmp(desc,"ALL"))
  300.         {
  301.             strcpy(desc,"*");
  302.             strcpy(value,"ALL");            
  303.         }
  304.         else
  305.         if( num_words(cmd) < 3)
  306.             get_prompt("Enter value to search for in field",value);
  307.         else
  308.             strcpy(value,get_word(-2,cmd));
  309.         [myDB getIsnListforField:desc value:value];
  310.         printf("Found %d matches\n",[myDB getListCount]);
  311.         break;
  312.     case SEARCH:
  313.         if (!opened)
  314.         {
  315.             printf("Must open first\n");
  316.             break;
  317.         }
  318.         if( num_words(cmd) < 2)
  319.             get_prompt("Enter field",desc);
  320.         else
  321.             strcpy(desc,get_word(1,cmd));
  322.         if( num_words(cmd) < 3)
  323.             get_prompt("Enter Operator",tmp_str);
  324.         else
  325.             strcpy(tmp_str,get_word(2,cmd));
  326.         if( num_words(cmd) < 4)
  327.             get_prompt("Enter Value",value);
  328.         else
  329.             strcpy(value,get_word(-3,cmd));
  330.             
  331.         [myDB getIsnListforField:desc value:value operator:tmp_str];
  332.         printf("Found %d matches\n",[myDB getListCount]);
  333.         break;    
  334.     case PRINT:
  335.         if (!opened)
  336.         {
  337.             printf("Must open first\n");
  338.             break;
  339.         }
  340. /*    Print Options */
  341.         if( num_words(cmd) < 2)
  342.             get_prompt("Enter option",tmp_str);
  343.         else
  344.             strcpy(tmp_str,get_word(1,cmd));
  345.         switch(which_cmd(tmp_str))    {
  346.     case ISNS:
  347.         Isns = [myDB getIsnList];
  348.         for(i=0;i<*Isns;i++)
  349.             {
  350.             printf("------------Record %d ----------\n", Isns[i+1]);
  351.             [myDB prtRecAtIsn:Isns[i+1]];
  352.             }
  353.         break;    
  354.     case ISN:
  355.         if( num_words(cmd) < 3)
  356.             get_prompt("Enter isn",tmp_str);
  357.         else
  358.             strcpy(tmp_str,get_word(2,cmd));
  359.         sscanf(tmp_str,"%d",&i);
  360.         [myDB prtRecAtIsn:i];
  361.         break;    
  362.     case KEYTBL:
  363.         if (!opened)
  364.         {
  365.             printf("Must open first\n");
  366.             break;
  367.         }
  368.         get_prompt("Enter keyed field",desc);
  369.         [myDB prtKeyTableFor:desc];
  370.         break;
  371.     case HELP:
  372.         printf("Print Options are: isns, isn, keytable\n");
  373.         break;
  374.     default:
  375.         break;
  376.         }
  377.         break;    
  378.     case LIST:
  379.         if (!opened)
  380.         {
  381.             printf("Must open first\n");
  382.             break;
  383.         }
  384. /*    List Options */
  385.         if( num_words(cmd) < 2)
  386.             get_prompt("Enter option",tmp_str);
  387.         else
  388.             strcpy(tmp_str,get_word(1,cmd));
  389.         switch(which_cmd(tmp_str))    {
  390.     case ISNS:
  391.         Isns = [myDB getIsnList];
  392.         for(i=0;i<*Isns;i++)
  393.             {
  394.             if((i-(i/10)*10) == 0)    printf("\n");
  395.             printf("%5d ",Isns[i+1]);
  396.             }
  397.             printf("\n");
  398.         break;
  399.     case FIELDS:
  400.         get_prompt("Enter keyed field to list",desc);
  401.         printf("# value    - count for key field %s\n",desc);
  402.         [myDB listKeysForField:desc];
  403.         break;    
  404.     case LAST:
  405.         Last = [myDB getLastList];
  406.         for(i=0;i<Last[0];i++)
  407.             {
  408.             if((i-(i/10)*10) == 0)    printf("\n");
  409.             printf("%5d ",Last[i+1]);
  410.             }
  411.             printf("\n");
  412.         break;
  413.     case HELP:
  414.         printf("List options are:  isns, fields, last\n");
  415.         break;
  416.     default:
  417.             break;
  418.         }
  419.         break;
  420.     case UPDATE:
  421.         if (!opened)
  422.         {
  423.             printf("Must open first\n");
  424.             break;
  425.         }
  426. /*    Update Options */
  427.         if( num_words(cmd) < 2)
  428.             get_prompt("Enter option",tmp_str);
  429.         else
  430.             strcpy(tmp_str,get_word(1,cmd));
  431.         switch(which_cmd(tmp_str))    {
  432.     case ISNS:
  433.         Isns = [myDB getIsnList];
  434.         strcpy(desc,"");
  435.         if( num_words(cmd) < 3)
  436.             get_prompt("Enter field abbrev",load_file);
  437.         else
  438.             strcpy(load_file,get_word(2,cmd));
  439. if ((myField =[myDB getFldDesc:[myDB getFldNumForAbbrev:load_file]]) == NULL)
  440.     {
  441.         printf("Field %s not in data base\n",load_file);
  442.         Isns = [myDB pushList:0];
  443.         break;
  444.         }
  445.             printf("Enter replacement value for field %s: ",myField->name);
  446.             switch (myField->kind)    {
  447.             case 'I':
  448.             case 'L':
  449.                 gets(tmp_str);
  450.                 sscanf(tmp_str,"%d",&u.num);
  451.                 strcat(desc,myField->abbrev);
  452.                 strcat(desc,",4,");
  453.                 break;
  454.             case 'A':
  455.                 gets(u.str);
  456.                 l = strlen(u.str);
  457.                 strcat(desc,myField->abbrev);
  458.                 sprintf(tmp_str,",%d,",l);
  459.                 strcat(desc,tmp_str);
  460.                 break;
  461.             }
  462.         for(i=0;i<*Isns;i++)
  463.             [myDB updateDataAtIsn:Isns[i+1] with:(char *)u.str
  464.                 describedBy:desc];            
  465.         break;
  466.     case ISN:
  467.         if( num_words(cmd) < 3)
  468.             get_prompt("Enter isn",tmp_str);
  469.         else
  470.             strcpy(tmp_str,get_word(2,cmd));
  471.         sscanf(tmp_str,"%d",&i);
  472.         j = [myDB numberFlds];
  473.         for (k=0; k<j; k++)    {
  474.             myField = [myDB getFldDesc:k];
  475.             printf("%s, ",myField->name);
  476.             switch (myField->kind)    {
  477.             case 'I':
  478.             case 'L':
  479.                 strcpy(desc,myField->abbrev);
  480.                 strcat(desc,",4,");
  481.         [myDB getData:(char *)u.str atIsn:i describedBy:desc];
  482.         printf(" %s = %d , Replace with <cr> : ",myField->abbrev,u.num);
  483.                 gets(tmp_str);
  484.                 if (strlen(tmp_str) == 0) break;
  485.                 sscanf(tmp_str,"%d",&u.num);
  486.             [myDB updateDataAtIsn:i with:(char *)u.str
  487.                 describedBy:desc];            
  488.                 break;
  489.             case 'A':
  490.                 strcpy(desc,myField->abbrev);
  491.                 strcat(desc,",128,");
  492.         [myDB getData:(char *)u.str atIsn:i describedBy:desc];
  493.         printf(" %s = %s , Replace with <cr> : ",myField->abbrev,u.str);
  494.                 gets(tmp_str);
  495.                 if (strlen(tmp_str) == 0) break;
  496.                 strcpy(u.str,tmp_str);
  497.             [myDB updateDataAtIsn:i with:(char *)u.str
  498.                 describedBy:desc];            
  499.                 break;
  500.             }
  501.         }
  502.         break;
  503.     case HELP:
  504.     default:
  505.         printf("Options are isns for mass update and isn for single\n");
  506.         break;
  507.     }
  508.         break;
  509.     case CLOSE:
  510.         if (!opened)
  511.         {
  512.             printf("Must open first\n");
  513.             break;
  514.         }    
  515.         [myDB close];
  516.         strcpy(desc,dbname);
  517.         strcat(desc,".dta");
  518.         typedStream = NXOpenTypedStreamForFile(desc,NX_WRITEONLY);
  519.         NXWriteRootObject(typedStream,myDB);
  520.         NXCloseTypedStream(typedStream);
  521.         printf("DB Archived to %s\n",desc);
  522.         [myDB free];
  523.         opened = FALSE;
  524.         strcpy(dbname,"NULL");
  525.         break;
  526.     case DELETE:
  527.         if (!opened)
  528.         {
  529.             printf("Must open first\n");
  530.             break;
  531.         }
  532. /*    Delete Options */
  533.         if( num_words(cmd) < 2)
  534.             get_prompt("Enter option",tmp_str);
  535.         else
  536.             strcpy(tmp_str,get_word(1,cmd));
  537.         switch(which_cmd(tmp_str))    {
  538.     case ISN:
  539.         if( num_words(cmd) < 3)
  540.             get_prompt("Enter isn",tmp_str);
  541.         else
  542.             strcpy(tmp_str,get_word(2,cmd));
  543.         sscanf(tmp_str,"%d",&i);
  544.         [myDB deleteDataAtIsn:i];
  545.         break;    
  546.     case ISNS:
  547.         Isns = [myDB getIsnList];
  548.         for(i=0;i<*Isns;i++)
  549.             {
  550.             if((i-(i/10)*10) == 0)    printf("\n");
  551.             printf("%5d ",Isns[i+1]);
  552.             }
  553.             printf("\n");
  554.         break;
  555.     case HELP:
  556.         printf("Delete options are: isn, isns\n");
  557.         break;
  558.     default:
  559.         break;
  560.         }
  561.         break;
  562.     case LOAD:
  563.         if (!opened)
  564.         {
  565.             printf("Must open first\n");
  566.             break;
  567.         }
  568.         if( num_words(cmd) < 2)
  569.             get_prompt("Enter File to load from",load_file);
  570.         else
  571.             strcpy(load_file,get_word(1,cmd));
  572.     fptr = (FILE *)fopen(load_file,"r");
  573.         printf("Here we should enter descriptor string and input format\n");
  574.     i = 0;
  575.     while(1)    {
  576.         fscanf(fptr,"%s %s %ld\n",rec.last_name,rec.first_name,&rec.phone_no);
  577.         printf("Added isn %d: %s , %s\n",
  578.             [myDB addData:(char *)rec.last_name:"LN,12,FN,12,PH,L,"],
  579.             rec.last_name,rec.first_name);
  580.         if (feof(fptr) != 0) break;
  581.         i++;
  582.         }
  583.         break;
  584.     case SHOW:
  585.         if (!opened)
  586.         {
  587.             printf("Must open first\n");
  588.             break;
  589.         }    
  590.         if( num_words(cmd) != 2)
  591.             get_prompt("Enter option",tmp_str);
  592.         else
  593.             strcpy(tmp_str,get_word(1,cmd));
  594.         switch(which_cmd(tmp_str))    {
  595.         case STRUCTURE:
  596.             [myDB prtStructure];
  597.             break;
  598.         case STATUS:
  599.             [myDB status];
  600.             break;
  601.         case CACHE:
  602.             [myDB prtCacheStats];
  603.             break;
  604.         case ALLOC:
  605.             [myDB dumpSpace];
  606.             break;
  607.         case ISNTABLES:
  608.             [myDB dumpIsns];
  609.             break;
  610.         case HELP:
  611.             printf("The options are: structure, status,\n");
  612.             printf("                 cache, alloc, isntables.\n");
  613.             break;
  614.         default:
  615.             [myDB prtStructure];
  616.             [myDB status];
  617.             [myDB prtCacheStats];
  618.         get_prompt("Do you wish to see alloc tables?",desc);
  619.         if(toupper(desc[0]) == 'Y')
  620.             [myDB dumpSpace];
  621.         get_prompt("Do you wish to see isn tables?",desc);
  622.         if(toupper(desc[0]) == 'Y')
  623.             [myDB dumpIsns];
  624.         break;
  625.         }
  626.         break;
  627.     case READ:
  628.     /*    Read  */
  629.         if (!opened)
  630.         {
  631.             printf("Must open first\n");
  632.             break;
  633.         }    
  634.         printf("Try to read records\n");
  635.         printf("**This should be for general format from descriptor\n");
  636.         j = [myDB numberIsns];
  637.         for (i=0;i<j;i++)
  638.         {
  639.             strcpy(rec.last_name,"");
  640.             strcpy(rec.first_name,"");
  641.             if ([myDB getData:(char *)rec.last_name atIsn:i
  642.                 describedBy:"LN,12,FN,6,"] != NULL)
  643.             printf("%d) %s , %s\n",i,
  644.                 rec.last_name,rec.first_name);
  645.         }
  646.         break;
  647.     case QUIT:
  648.         if (opened)    {
  649.             get_prompt("Data base open, save changes (y/n)",tmp_str);
  650.             if (toupper(tmp_str[0]) == 'Y')    {
  651.                 [myDB close];
  652.                 strcpy(desc,dbname);
  653.                 strcat(desc,".dta");
  654.                 typedStream = NXOpenTypedStreamForFile(desc,NX_WRITEONLY);
  655.                 NXWriteRootObject(typedStream,myDB);
  656.                 NXCloseTypedStream(typedStream);
  657.                 printf("DB Archived to %s\n",desc);
  658.                 [myDB free];
  659.                 }
  660.         }    
  661.         exit(0);
  662.         break;
  663.     case HELP:
  664.         prt_cmds();
  665.         break;
  666.     case GRIPE:
  667.         gripe();
  668.         break;
  669.     default:
  670.         printf("Command %s not recognized\n",cmd);
  671.         kount--;
  672.         break;
  673.     }
  674. }
  675.     
  676. }
  677.  
  678. int gripe()
  679. {
  680.     char gripe_msg[128];
  681.     char sys_msg1[128];
  682.     char sys_msg2[128] = "cat .gripe_msg | mail -s ObjDB_Gripe woo@ornl.gov; /bin/rm .gripe_msg";
  683.     
  684.     printf("Enter complaint or alloclade : ");
  685.     gets(gripe_msg);
  686.     sprintf(sys_msg1,"echo %s > .gripe_msg",gripe_msg);
  687.     system(sys_msg1);
  688.     system(sys_msg2);
  689.     return TRUE;
  690. }
  691.  
  692. int get_cmd(str)
  693.     char *str;
  694. {
  695.     int which_cmd();
  696.     char *cmd, *get_word();
  697.     
  698.     gets(str);
  699.     cmd = get_word(0,str);
  700.     return(which_cmd(cmd));
  701. }
  702.  
  703. int which_cmd(cmd)
  704.     char *cmd;
  705. {
  706.     int i, strlen(), strcmp();
  707.     
  708.     for (i=0; strlen(commands[i]) > 0; i++)
  709.         if (!strcmp(cmd,commands[i])) return i;
  710.     return 99;
  711. }
  712.  
  713. void prt_cmds()
  714. {
  715.     int i, strlen();
  716.     
  717.     printf("Commands are: ");
  718.     for (i=0; strlen(commands[i]) > 0; i++)
  719.         {
  720.             if ((i-(i/10)*10) == 0) printf("\n");
  721.             printf("%s, ",commands[i]);
  722.         }
  723.     printf("\n");
  724.     return;
  725. }
  726.  
  727. int get_prompt(prompt,value)
  728.     char *prompt, *value;
  729. {
  730.     int num_words();
  731.         
  732.         printf("%s : ",prompt);
  733.         gets(value);
  734.             
  735.     return (num_words(value));
  736. }
  737.  
  738. int num_words(str)
  739.     char *str;
  740. {
  741.     int i = 0;
  742.     char *ptr;
  743.     
  744.     ptr = str;
  745.     
  746.     while (TRUE)
  747.         {
  748.             while(*ptr == ' ')    ptr++;    /* skip leading blanks */
  749.             if (*ptr == '\0' || *ptr == '\n') return i;
  750.               while(*ptr != ' ' && *ptr != '\0' && *ptr != '\n' ) ptr++;
  751.             i++;
  752.           }
  753. }
  754.  
  755. char *get_word(n,str)
  756.     int n;
  757.     char *str;
  758. {
  759.     char *strcpy();
  760.     static char dummy[256];
  761.     char *ptr = str;
  762.     int i = 0;
  763.     int j = 0;
  764.     
  765.     strcpy(dummy,"");
  766.         
  767.     /* special case neg argument means rest of line starting at nth arg. */
  768.     if ( n < 0)
  769.     {
  770.     n = -n;
  771.     while (TRUE)
  772.         {
  773.             while(*ptr == ' ')    ptr++;    /* skip leading blanks */
  774.             if (i == n) break;
  775.             if (*ptr == '\0' || *ptr == '\n') return "";
  776.               while(*ptr != ' ' && *ptr != '\0' && *ptr != '\n' ) ptr++;
  777.             i++;
  778.           }
  779.             while(*ptr != '\0')
  780.                 {
  781.                     if(*ptr == '\n') break;
  782.                     dummy[j++] = *ptr++;
  783.                 }
  784.                 
  785.             dummy[j] = '\0';
  786.     return dummy;
  787.     }
  788.     else while (TRUE)
  789.         {
  790.             while(*ptr == ' ')    ptr++;    /* skip leading blanks */
  791.             if (i == n) break;
  792.             if (*ptr == '\0' || *ptr == '\n') return "";
  793.               while(*ptr != ' ' && *ptr != '\0' && *ptr != '\n' ) ptr++;
  794.             i++;
  795.           }
  796.             while(*ptr != ' ')
  797.                 {
  798.                     if(*ptr == '\0') break;
  799.                     if(*ptr == '\n') break;
  800.                     dummy[j++] = *ptr++;
  801.                 }
  802.                 
  803.             dummy[j] = '\0';
  804.     return dummy;
  805. }
  806.